package pfc.view.control;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;

import javax.swing.JInternalFrame;
import javax.swing.JMenuBar;

import pfc.view.Main;
import pfc.view.view.components.model.JMenuItemValidator;
import pfc.view.view.components.model.JMenuValidator;
import pfc.view.view.formularios.TelaAbout;
import pfc.view.view.formularios.TelaCodificar;
import pfc.view.view.formularios.TelaDecodificar;


public class GeraMenuAplicacao {

	private GeraMenuAplicacao(){
		super();
	}
	
	private static GeraMenuAplicacao geraMenuAplicacao;
	
	public static GeraMenuAplicacao getInstance(){
		if(geraMenuAplicacao == null){
			geraMenuAplicacao = new GeraMenuAplicacao();
		}
		return geraMenuAplicacao;
	}
	
	public static String MENU_ACOES = "Ações";
	
	public static String ACOES_CODIFICAR = "Codificar";
	
	public static String ACOES_DECODIFICAR = "Decodificar";
	
	public static String MENU_MANUTENCAO = "Manutenção";
	
	public static String MENU_AJUDA = "Ajuda";
	
	public static String AJUDA_SOBRE = "Sobre";
	
	private JMenuValidator menuAcoes = null;
	
	private JMenuValidator menuJanela = null;
	
	private Map aplicacoesAbertas = new HashMap();
	
	private JMenuBar barraMenu = null;
	
	public Map getAplicacoesAbertas(){
		return aplicacoesAbertas;
	}
	
	
	public void adicionaAplicacoesAbertas(JInternalFrame aplicacao, JMenuItemValidator menu){
		final JMenuItemValidator menuClone = (JMenuItemValidator)menu.clone();
		menuClone.setVisible(true);
		
		//title é usado como identificador da janela no menu de janelas abertas
		String title = aplicacao.getTitle();
		
		JMenuItemValidator confirmaMenu = (JMenuItemValidator)aplicacoesAbertas.get(title);
		if(confirmaMenu != null){
			return;
		}
		aplicacoesAbertas.put(title, menuClone);
		menuJanela.add(menuClone);
		menuJanela.updateUI();
		Main.instance.getJJMenuBarMenuBar().updateUI();
	}
	
	public void removeAplicacoesAbertas(JInternalFrame aplicacao){
		//title é usado como identificador da janela no menu de janelas abertas
		String title = aplicacao.getTitle();
		
		JMenuItemValidator menu = (JMenuItemValidator)aplicacoesAbertas.get(title);
		menuJanela.remove(menu);
		aplicacoesAbertas.remove(title);
	}
	
	public static final Integer ADMINISTRADOR = new Integer(0);
	public static final Integer GERENTE = new Integer(1);
	public static final Integer CONSULTAR = new Integer(2);
	
	public JMenuBar geraMenuBar() {
		
		barraMenu = new JMenuBar();
		barraMenu.add(menuAcoes());
		barraMenu.add(menuJanela());
		
		JMenuValidator menuAjuda = new JMenuValidator(CONSULTAR);
		menuAjuda.setText(MENU_AJUDA);
		
		JMenuItemValidator itemMenuSobre = new JMenuItemValidator(CONSULTAR);
		itemMenuSobre.setText(AJUDA_SOBRE);
		itemMenuSobre.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				TelaAbout about = new TelaAbout(Main.instance);
				about.show();
			}
		});

		menuAjuda.add(itemMenuSobre);
		barraMenu.add(menuAjuda);

		
		return barraMenu;
	}

	public JMenuValidator menuAcoes() {
		menuAcoes = new JMenuValidator(CONSULTAR);
		menuAcoes.setText(MENU_ACOES);
		itensMenuAcoes(menuAcoes);
		return menuAcoes;
	}

	public void itensMenuAcoes(JMenuValidator menuAcoes) {
		
		final JMenuItemValidator menuCodificar = new JMenuItemValidator(ADMINISTRADOR);
		menuCodificar.setText(ACOES_CODIFICAR);
		menuCodificar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				TelaCodificar telaCodificar = new TelaCodificar();
				telaCodificar.setVisible(true);
				ScreenManager.manage(telaCodificar);
				adicionaAplicacoesAbertas(telaCodificar, menuCodificar);
			}
		});
		
		final JMenuItemValidator menuDecodificar = new JMenuItemValidator(ADMINISTRADOR);
		menuDecodificar.setText(ACOES_DECODIFICAR);
		menuDecodificar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				TelaDecodificar telaDecodificar = new TelaDecodificar();
				telaDecodificar.setVisible(true);
				ScreenManager.manage(telaDecodificar);
				adicionaAplicacoesAbertas(telaDecodificar, menuDecodificar);
			}
		});
		
		menuAcoes.add(menuCodificar);
		menuAcoes.add(menuDecodificar);
	}
	
	public JMenuValidator menuJanela() {
			menuJanela = new JMenuValidator(CONSULTAR);
			menuJanela.setText("Janelas Abertas");

		return menuJanela;
	}
}

